import time, os, gc, sys
from media.display import *
from media.media import *
from machine import TOUCH
from led_control import LEDController, TouchSlider

# 全局变量，用于资源清理
led_controller = None

try:
    # 显示模式选择：可以是 "LCD" 或 "HDMI"
    DISPLAY_MODE = "LCD"

    # 根据模式设置显示宽高
    if DISPLAY_MODE == "LCD":
        # 3.1寸屏幕模式
        DISPLAY_WIDTH = 800
        DISPLAY_HEIGHT = 480
    elif DISPLAY_MODE == "HDMI":
        # HDMI扩展板模式
        DISPLAY_WIDTH = 1920
        DISPLAY_HEIGHT = 1080
    else:
        raise ValueError("未知的 DISPLAY_MODE，请选择 'LCD' 或 'HDMI'")

    # 根据模式初始化显示器
    if DISPLAY_MODE == "LCD":
        Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
    elif DISPLAY_MODE == "HDMI":
        Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)

    # 初始化媒体管理器
    MediaManager.init()

    # 创建绘制的图像
    img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.RGB565)
    img.clear()

    # 初始化LED控制器
    led_controller = LEDController(pin=61, channel=1, freq=2000, initial_duty=50)
    
    # 初始化触摸屏
    tp = TOUCH(0)
    
    # 创建多个亮度调节滑块，展示不同颜色和位置
    sliders = [
        # 主滑块 - 蓝色，屏幕底部
        TouchSlider(
            img, 
            int((DISPLAY_WIDTH - 600) // 2), 
            int(DISPLAY_HEIGHT - 100), 
            600, 
            40, 
            led_controller, 
            color=(0, 150, 255), 
            bg_color=(50, 50, 50)
        ),
        # 第二个滑块 - 绿色，屏幕中部
        TouchSlider(
            img, 
            int((DISPLAY_WIDTH - 500) // 2), 
            int(DISPLAY_HEIGHT // 2), 
            500, 
            30, 
            led_controller, 
            color=(0, 255, 100), 
            bg_color=(50, 50, 50)
        ),
        # 第三个滑块 - 红色，屏幕上部
        TouchSlider(
            img, 
            int((DISPLAY_WIDTH - 400) // 2), 
            150, 
            400, 
            25, 
            led_controller, 
            color=(255, 50, 50), 
            bg_color=(50, 50, 50)
        )
    ]
    
    # 添加标题
    def draw_title():
        img.draw_string_advanced(int(DISPLAY_WIDTH // 2 - 150), 50, 40, "LED亮度控制演示", color=(255, 255, 255), scale=3)
    
    # 添加说明文字
    def draw_instructions():
        img.draw_string_advanced(50, int(DISPLAY_HEIGHT - 40), 30, "滑动任意滑块调节LED亮度", color=(200, 200, 200), scale=1.5)
    
    while True:
        try:
            fps = time.clock()
            fps.tick()
            
            # 检查是否在退出点
            os.exitpoint()
            
            # 清除屏幕
            img.clear()
            
            # 绘制标题和说明
            draw_title()
            draw_instructions()
            
            # 处理触摸输入
            touch_points = tp.read(1)
            if touch_points != ():
                for point in touch_points:
                    # 尝试每个滑块，看是否有触摸事件
                    for slider in sliders:
                        if slider.handle_touch(point):
                            # 如果有一个滑块被触摸并改变了值，同步所有滑块的值
                            for other_slider in sliders:
                                other_slider.value = slider.value
                            break
            
            # 绘制所有滑块
            for slider in sliders:
                slider.draw()
            
            # 显示当前帧率
            img.draw_string_advanced(10, 10, 20, f"FPS: {int(fps.fps())}", color=(255, 255, 0), scale=1.5)
            
            # 显示绘制结果
            Display.show_image(img)
            
            # 垃圾回收
            gc.collect()
            
            # 短暂休眠，减少CPU占用
            time.sleep_ms(10)
            
        except Exception as e:
            error_type = type(e).__name__
            if error_type == 'KeyboardInterrupt' or 'IDE interrupt' in str(e):
                print("用户中断，正在退出...")
                break
            else:
                sys.print_exception(e)
                print("发生错误，但程序将继续运行...")
                # 短暂暂停以避免错误消息快速循环
                time.sleep_ms(500)
            
except KeyboardInterrupt as e:
    print(f"用户停止")
except BaseException as e:
    sys.print_exception(e)
finally:
    # 清理资源，使用try-except确保即使清理过程有错误也能继续执行
    if led_controller:
        try:
            led_controller.deinit()
        except:
            pass
    
    try:
        # 销毁display
        Display.deinit()
    except:
        pass
    
    try:
        # 释放媒体缓冲区
        MediaManager.deinit()
    except:
        pass 